package com.example.tools;

import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

public class ImageUilt {

    public static File cutOutImage(MultipartFile multipartFile, Double heightPercentage, String savePath) {
        // 获取图片类型
        String imageType = multipartFile.getOriginalFilename().split("\\.")[1];
        // 1、通过 MultipartFile 获取宽高
        // 图片原始宽度
        int width = 0;
        // 图片原始高度
        int height = 0;
        try {
            // 获取原始图片的InputStream 流
            InputStream originalInput = multipartFile.getInputStream();
            BufferedImage bufferedImage = ImageIO.read(originalInput);
            if (bufferedImage == null) {
                // 证明上传的文件不是图片，获取图片流失败，不进行下面的操作
//                throw new BusinessException("请上传正确图片格式 !");
            }
            width = bufferedImage.getWidth();
            height = bufferedImage.getHeight();
        } catch (IOException e) {
            e.printStackTrace();
//            log.info("获取上传原始图片高宽失败：" + e.getMessage());
        }

        // 2、将图片文件写入本地
        // 创建要创建 文件的file对象
        File saveUrlFile = new File(savePath);
        // 检测该路径是否存在父文件夹目录  有则返回true无则进行创建
        if (!saveUrlFile.getParentFile().exists()) {
            saveUrlFile.getParentFile().mkdirs();
        }
        try {
            // 将图片文件保存本地指定动态获取的路径
            multipartFile.transferTo(saveUrlFile);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 3、读取本地图片文件最终将文件替换成截取完毕的图片
        // 创建文件输入流
        InputStream inputFile = null;
        // 创建图片读取流
        ImageInputStream imageStream = null;
        try {
            // 从文件流中读取数据
            inputFile = new FileInputStream(saveUrlFile);
            // 将图片转化为 imageReader
            Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageType);
            ImageReader reader = readers.next();
            // 读入图片
            imageStream = ImageIO.createImageInputStream(inputFile);
            reader.setInput(imageStream, true);
            // 参数用来装 图片需要设置的 高宽
            ImageReadParam param = reader.getDefaultReadParam();
            // 图片裁剪范围 当前业务只需要截取 图片最底下的一部分即可 所以对高进行处理
            Rectangle rect = new Rectangle(width, (int) (height * heightPercentage));
            param.setSourceRegion(rect);
            // 将裁剪出图片 输出到指定文件夹
            ImageIO.write(reader.read(0, param), imageType, new File(savePath));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭使用完毕的流，防止资源占用
            try {
                inputFile.close();
                // 断言判断图片流文件不为空
                assert imageStream != null;
                imageStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 4、返回file
        return saveUrlFile;
    }
}
